package com.lyt.springboot.util.algorithm;

public class S16 {

    public static void main(String[] args) {
        S16 s16 = new S16();
        boolean b = s16.isIPv4("172.016.254.1");
        System.out.println(b);
    }
    //验证ipv4 ipv6
    public String solve (String IP) {
        // write code here
        /*
        IPv4 地址由十进制数和点来表示，每个地址包含4个十进制数，其范围为 0 - 255， 用(".")分割。比如，172.16.254.1；
        同时，IPv4 地址内的数不会以 0 开头。比如，地址 172.16.254.01 是不合法的。
        IPv6 地址由8组16进制的数字来表示，每组表示 16 比特。这些组数字通过 (":")分割。比如,  2001:0db8:85a3:0000:0000:8a2e:0370:7334 是一个有效的地址。
        而且，我们可以加入一些以 0 开头的数字，字母可以使用大写，也可以是小写。所以， 2001:db8:85a3:0:0:8A2E:0370:7334 也是一个有效的 IPv6 address地址 (即，忽略 0 开头，忽略大小写)。
        然而，我们不能因为某个组的值为 0，而使用一个空的组，以至于出现 (::) 的情况。 比如， 2001:0db8:85a3::8A2E:0370:7334 是无效的 IPv6 地址。
        同时，在 IPv6 地址中，多余的 0 也是不被允许的。比如， 02001:0db8:85a3:0000:0000:8a2e:0370:7334 是无效的。
         */
        if(isIPv4(IP)) {
            return "IPv4";
        }else if(isIPv6(IP)) {
            return "IPv6";
        }
        return "Neither";
    }
    /*
    1.存在.
    2.四个元素
    3.每个元素不超过是0到三个字符
    4.当某个元素首为0，则只能一位数
    5.数字不能超过255
     */
    public boolean isIPv4(String IP) {
        if(IP.indexOf(".") == -1) {
            return false;
        }
        String[] a = IP.split("\\.");
        if(a.length != 4) {
            return false;
        }
        for (int i = 0; i < a.length; i++) {
            if(a[i].length()<0 || a[i].length()>3){
                return false;
            }
            if(a[i].charAt(0) =='0' && a[i].length() >1) {
                return false;

            }
            try {
                Integer c = Integer.valueOf(a[i]);
                if(c<0 || c>255) {
                    return false;
                }
            } catch (NumberFormatException e) {
                return false;
            }
        }
        return true;
    }


    public boolean isIPv6(String IP) {
        /*
        1.有：
        2.八个元素
        3.每个元素的字符个数0到4  大于0
         */
        if(IP.indexOf(":")==-1) {
            return false;
        }
        String[] b = IP.split(":");
        for (int i = 0; i < b.length; i++) {
            if(b[i].length() <=0 || b[i].length()>4) {
                return false;
            }
            try {
                Integer d = Integer.valueOf(b[i], 16);
            } catch (NumberFormatException e) {
                return false;
            }

        }
        return true;
    }
}
